import java.util.*;

class Solution {
//    public int numberOfPoints(List<List<Integer>> nums) {
//        Collections.sort(nums, (o1, o2) -> o1.get(0) - o2.get(0));
//        int ret = 0;
//        int n = nums.size();
//        // 当前处理的区间的起点和终点
//        int start = nums.get(0).get(0);
//        int end = nums.get(0).get(1);
//
//        for (int i = 1; i < nums.size(); i++) {
//            int currStart = nums.get(i).get(0);
//            int currEnd = nums.get(i).get(1);
//
//            // 如果当前区间和之前的区间重叠
//            if (currStart <= end) {
//                // 合并区间
//                end = Math.max(end, currEnd);
//            } else {
//                // 计算上一个合并后的区间长度
//                ret += end - start + 1;
//                // 更新当前区间
//                start = currStart;
//                end = currEnd;
//            }
//        }
//        // 处理最后一个区间
//        ret += end - start + 1;
//
//        return ret;
//    }

    public int numberOfPoints(List<List<Integer>> nums) {
        int maxEnd = 0;
        for (List<Integer> p : nums) {
            maxEnd = Math.max(maxEnd, p.get(1));
        }

        int[] diff = new int[maxEnd + 2]; // 注意下面有 end+1
        for (List<Integer> interval : nums) {
            diff[interval.get(0)]++;
            diff[interval.get(1) + 1]--;
        }

        int ans = 0;
        int s = 0;
        for (int d : diff) {
            s += d;
            if (s > 0) {
                ans++;
            }
        }
        return ans;
    }
    public static void main(String[] args) {
        Solution solution = new Solution();

        // 构造测试用例
        List<List<Integer>> testData = new ArrayList<>();
        testData.add(Arrays.asList(3,6));  // 区间 [1, 3]
        testData.add(Arrays.asList(1,5));
        testData.add(Arrays.asList(4,7));

        // 调用方法并输出结果
        int result = solution.numberOfPoints(testData);
        System.out.println("The total number of points: " + result);
    }
}